package com.niu.advice;

import com.niu.pojo.OperateLog;
import com.niu.service.OperateLogService;
import com.niu.utils.MyThreadLocalUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Map;

/**
 * @Author 鹅鹅鹅
 * @Version 1.0.0
 * @Date 2025/7/19 19:38
 * @Description 操作日志切面类
 *
 * 将所有类执行的操作记录日志中
 *
 */
@Component
@Aspect
public class MyLogAspect {

    // 注入保存日志业务
    @Autowired
    private OperateLogService logService;

    @Around("execution(* com.niu.service.*.*(..))")
    public Object recodeLog(ProceedingJoinPoint pjp) throws Throwable {
        // 过滤login 方法
        String name = pjp.getSignature().getName();
        if ("login".equals(name) || "addLog".equals(name)){
            Object result = pjp.proceed();
            return result;
        }
        // 方法执行前
        long start = System.currentTimeMillis();

        // 方法执行
        Object result = null;
        try {
            result = pjp.proceed();
        } finally { // 防止 DeptServiceImpl2的 deletById 方法 回滚, 否则不可记录该方法的信息
            // 方法执行后
            long end = System.currentTimeMillis();
            // 执行时间
            double costTime = (end - start) / 1000.0;
            System.out.println(result + "=========================================================================================================================================================================================================================================================================================================");
            // 在ThreadLocal中获取登录人信息
            Map<String, Object> map = MyThreadLocalUtils.getValue();
            // 创建日志对象
            OperateLog log = OperateLog.builder()
                    // 操作人id
                    .operUser(Integer.parseInt(map.get("id").toString()))
                    // 操作时间
                    .operTime(LocalDateTime.now())
                    // 类名
                    .className(pjp.getSignature().getDeclaringTypeName())
                    // 方法名
                    .methodName(name)
                    // 参数
                    .methodParams(Arrays.toString(pjp.getArgs()))
                    // 返回结果
                    .returnValue(result == null ? "null" : result.toString())
                    // 执行时间
                    .costTime(costTime)
                    .build();

            // 记录日志
            logService.addLog(log);
        }

        return result;
    }

}
